-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
46-tgyuuAn #165
46-tgyuuAn #165
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ฒ๋ฆฌํ ๋ฌธ์์ด์ด B์ธ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋ค์ง์ด ์ฃผ๋๊ฑธ ๋ ์ฌ๋ฆฌ๋๋ฐ ์๊ฐ์ด ์ข ๊ฑธ๋ ธ์ต๋๋ค
์ฉ ๊ตฌํ์ผ๋ก ํ์ด์ ์ฝ๋๊ฐ ๋ง์ด ๊ธธ์ด์ก๋๋ฐ
ํ๊ท๋ ์ฒ๋ผ ๋ฐ๋ก ํด๋์ค ๋ง๋ค์ด์ ์ค๋ณต์ค์ด๊ณ ์ฝ๋ ๋ณด๊ธฐ ์ฝ๊ฒ ์ง๋๊ฒ ์ ํฉํด๋ณด์ด๋ ๋ฌธ์ ๊ฐ์์
ํ์ด๋ฐฉ๋ฒ์ ์ ๋ ๊ฑฐ์ ๋น์ทํ๊ฒ ํธ๋ผ์ด ์๋ฃ๊ตฌ์กฐ ํ์ฉํด์ ๋งต์ผ๋ก ๋ฌธ์๋ฅผ ๋ ธ๋ ๋จ์๋ก ๋๋ ๋ค ์ถ๊ฐ/์ญ์ /๊ฒ์ํ๋ ๋ฐฉ์์ผ๋ก ํ์์ต๋๋ค
from collections import *
from sys import *
N = 'NUM'
A = {}
B = {}
def add(node, s):
for char in s:
if char not in node:
node[char] = {N : 0}
node = node[char]
node[N] += 1
def delete(tree, s):
node = tree[s[0]]
node[N] -= 1
# S์ ๊ธธ์ด๊ฐ 1์ด๊ณ , ํธ๋ฆฌ์ ์ฒซ ๋
ธ๋ ์ค์ S์ ์ฒซ ๋ฌธ์๊ฐ ์๋ค๋ฉด return
if node[N] == 0:
tree.pop(s[0])
return
nodes = deque([(s[0], node)])
for i in range(1, len(s)):
node = node[s[i]]
nodes.append((s[i], node))
node[N] -= 1
# ์์ ๋ฌธ์ ์ค์์ ๋ค์ ์์์ด ์๋ ๋
ธ๋ ์ ๊ฑฐ
delete_child_char = None
while nodes:
char, node = nodes.pop()
if delete_child_char:
node.pop(delete_child_char)
if node[N] == 0:
delete_child_char = char
continue
delete_child_char = None
def find(s):
if len(s) == 1:
return 0
if s[0] not in A or s[-1] not in B:
return 0
a_dict = {}
prefix_length = 1
i = 1
node = A[s[0]]
# ์ ๋์ฌ์ ๊ธธ์ด 1 ~ (S๊ธธ์ด - 1)๊น์ง A์์ ๋ง๋ค์ด์ง๋ ๊ฐ์ ํ์
while prefix_length < len(s) and node:
a_dict[prefix_length] = node[N]
if s[i] not in node:
break
node = node[s[i]]
prefix_length += 1
i += 1
b_dict = {}
suffix_length = 1
i = len(s) - 2
node = B[s[-1]]
# ์ ๋ฏธ์ฌ์ ๊ธธ์ด 1 ~ (S๊ธธ์ด - 1)๊น์ง B์์ ๋ง๋ค์ด์ง๋ ๊ฐ์ ํ์
while suffix_length < len(s) and node:
b_dict[suffix_length] = node[N]
if s[i] not in node:
break
node = node[s[i]]
suffix_length += 1
i -= 1
cases = 0
for length in range(1, len(s)):
cases += a_dict.get(length, 0) * b_dict.get(len(s) - length, 0)
return cases
for _ in range(int(stdin.readline().strip())):
query = stdin.readline().split()
func, s = query[0], query[-1]
if func == 'find':
print(find(s))
continue
tree = B if query[1] == 'B' else A
# B๋ S๋ฅผ ๋ค์ง์ด์ ํธ๋ฆฌ์ ์ถ๊ฐํ๋ค
if query[1] == 'B':
s = s[::-1]
if func == 'add':
add(tree, s)
elif func == 'delete':
delete(tree, s)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ํธ๋ผ์ด ๋ฌธ์ ๋ฅผ 3๋ฒ์ฏค ๋ณด๋๊น ์ด์ ์ข ์ ๊ฒ ๊ฐ์์
๋ฌธ์ ๋๊น์ง ํ์ง๋ ๋ชปํ์ง๋ง, ํธ๋ผ์ด๋ฅผ ์์ ๋ชฐ๋๋ ์ฒ์๋ณด๋ค ์ด๋ค ๋ฐฉํฅ์ผ๋ก ํ์ด๋๊ฐ์ผํ ์ง๋ ๋๋ต์ ์ผ๋ก ๊ฐ์ด ์กํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ฏธ์ด B์ ๋ํ ์ฒ๋ฆฌ๋ A๋ ๋์ผํ๋ค๊ณ ์๊ฐํ๋๋ฐ ํ๊ท๋ PR ๋ณด๋๊น ๋ฐ๋๋ก ๋ฃ์์ด์ผ ํ๋ค์ ํํ
์์ธํ PR ์์ฑ ํญ์ ๊ฐ์ฌํฉ๋๋ค :)
#include <iostream>
#include <array>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <map>
using namespace std;
struct Node {
int count;
array<Node *, 26> children;
};
int nodeCnt = 0;
vector<Node> nodes(999002);
Node *A, *B;
map<string, unordered_map<string, Node *> > cache;
Node *createNode() {
return &nodes[nodeCnt++];
}
void init() {
A = createNode();
B = createNode();
}
void add(const string &target, const string &S) {
Node *curNode = target == "A" ? A : B;
for (int i = 0; i < static_cast<const int>(S.size()); i++) {
const int ch = S[i] - 'a';
if (!curNode->children[ch]) {
curNode->children[ch] = createNode();
}
curNode = curNode->children[ch];
curNode->count++;
cache[target][S.substr(0, i + 1)] = curNode;
}
}
void del(Node *curNode, const string &S) {
for (char ch: S) {
ch -= 'a';
curNode = curNode->children[ch];
curNode->count--;
}
}
int find(const string &target, const string &S) {
if (!cache[target].contains(S)) return 0;
return cache[target][S]->count;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
init();
int Q;
cin >> Q;
while (Q--) {
string command;
cin >> command;
if (command == "add") {
string target, S;
cin >> target >> S;
if (target == "B") {
ranges::reverse(S);
}
add(target, S);
continue;
}
if (command == "delete") {
string target, S;
cin >> target >> S;
if (target == "A") {
del(A, S);
continue;
}
if (target == "B") {
ranges::reverse(S);
del(B, S);
}
continue;
}
if (command == "find") {
int count = 0;
string S;
cin >> S;
for (int i = 1; i < static_cast<const int>(S.size()); i++) {
string prefix = S.substr(0, i);
string suffix = S.substr(i);
ranges::reverse(suffix);
count += find("A", prefix) * find("B", suffix);
}
cout << count << '\n';
}
}
return 0;
} ๋ก์ง์ ๊ฐ์๋ฐ ๊ณ์ 97%์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ ์ ํธ๋ผ์ด์ ๊ฐ ๋ ธ๋๋ฅผ ๋งคํํ๋๋ ์์ฌ์์ฌํ๊ฒ ํต๊ณผํ์ต๋๋ค. ์ข ๋ ์ต์ ํํ ๊ป๋์ง๊ฐ ์๋์ง ๋์ค์ ํ ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค. |
๐ ๋ฌธ์ ๋งํฌ
AB
โ๏ธ ์์๋ ์๊ฐ
40๋ถ
โจ ์๋ ์ฝ๋
a = [a, ab, aba]
์b = [b, ab, bab]
๊ฐ ์์ ๋์ ๊ฐ์ด$a + bab, ab + ab, aba + b$ ๊ฐ ์๋ A์์
aba
๋ฅผ ๊ณจ๋์ ๋,aba
์ ๋ถ๋ถ ์งํฉ์ธa
,ab
,aba
๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ํฌ์ธํธ๋ค.์ฌ๊ธฐ์์ ์ง๋ 2๊ฐ์ PR์์ ์ฌ์ฉ๋์๋ ํธ๋ผ์ด ์๋ฃ๊ตฌ์กฐ๊ฐ ์ฌ์ฉ๋๋ค.
aba
๋ผ๋ ๋ฌธ์๊ฐ ์์ ๋ ์ด ๋ฌธ์๋ฅผa
,ab
,aba
๋ผ๋ ๋ฌธ์๋ก ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํธ๋ผ์ด ์๋ฃ๊ตฌ์กฐ์ ๋ฃ์ด์ผ ํ๋ค.์ผ๋จ ๋ฌธ์ ์์ ์ํค๋ ๋๋ก 2๊ฐ์ ํธ๋ผ์ด ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ค๋ค.
์ฌ๊ธฐ์ ์ฌ์ค A ํธ๋ผ์ด์
a
๋a
,ab
,aba
3๊ฐ์ ์์์์ ๋์ฌ ์ ์๋ ๋ถ๋ถ ์งํฉ์ด๊ธฐ ๋๋ฌธ์ ์ด 3๊ฐ๊ฐ ์๋ ์ ์ด๋ค.ab
๋ ๋ง์ฐฌ๊ฐ์ง๋กab
,aba
2๊ฐ์ ์์์์ ๋์ฌ ์ ์๋ ๋ถ๋ถ ์งํฉ์ด๊ธฐ ๋๋ฌธ์ ์ด 2๊ฐ๊ฐ ์๋ ์ ์ด๋ค.aba
๋aba
์์๋ง ๋์ฌ ์ ์๊ธฐ ๋๋ฌธ์ 1๊ฐ๊ฐ ์๋ ์ ์ด๋ค.์ฆ, ์ด๋ค ๊ฐ๊ฐ์ ํ์๋์ด ๋์ฌ ์ ์๋ ๊ฐ์๋ฅผ ์นด์ดํ ํ๊ธฐ ์ํด ์์ ๊ฐ์๋ฅผ ๋ฌ์์ค๋ค.
๊ทธ๋ฌ๋ฉด A์์
a
๋ฅผ ๊ณจ๋์ ๋ B์์๋bab
๋ฅผ ๊ณ ๋ฅผ ๊ฒฝ์ฐabab
๋ฅผ ์์ฑํ ์ ์๋ค.->$3 X 1 = 3$
A์์
ab
๋ฅผ ๊ณจ๋์ ๋ B์์ab
๋ฅผ ๊ณ ๋ฅด๋ฉดabab
๋ฅผ ์์ฑํ ์ ์๋ค.->$2 X 2 = 4$
A์์
aba
๋ฅผ ๊ณจ๋์ ๋ B์์b
๋ฅผ ๊ณ ๋ฅด๋ฉดabab
๋ฅผ ์์ฑํ ์ ์๋ค.->$1 X 3 = 3$
->$3 + 4 + 3 = 10$
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์, ํ์ฌ ์์์์ B์ ํธ๋ผ์ด์ ๋ค์ด๊ฐ๋ ์์๊ฐ
bab
๋ผ ์๊ณผ ๋ค๊ฐ ๊ฐ์๋ฐ,B์ ๋ค์ด๊ฐ๋ ์์๋ ์ ๋ฏธ์ด๋ก ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋ค์์๋ถํฐ ๋ฐ๋๋ก ๋ฃ์ด์ค์ผ ํ๋ค.
์๋ฅผ ๋ค์ด
abc
๋ฅผ ๋ฃ๋๋ค๊ณ ํ๋ฉด c -> b -> a ์์๋ก ๋ฃ์ด์ผ ํจ.๋น์ฐํ๊ฒ ์ง๋ง
add
๋ฅผ ํ ๋ ์ง๋์จ ๊ฒฝ๋ก์ count๋ฅผ 1์ฉ ๋ชจ๋ ๋ํด์ฃผ๊ณ ,delete
์ ์ง๋์จ ๊ฒฝ๋ก์ count๋ฅผ 1์ฉ ๋นผ๋ฉด์ ์ง๋๊ฐ์ค๋ค.์๋ ์ฌ์ง์ ์ ์์์์
delete A abc
๋ฅผ ํ์ ๋์ ๊ฒฐ๊ณผ์ด๋ค.์ฌ๊ธฐ์ ์ถ๊ฐ์ ์ผ๋ก ๋ ๋ฒ์งธ ์์๋ฅผ ์๋ก ๋ค์ด๋ณด์๋ฉด,
์๋ ์ฌ์ง์ด ์ฒซ ๋ฒ์งธ
find abcd
๋ฅผ ํ๊ธฐ ์ ์ ํธ๋ผ์ด ์ํ์ด๋ค.(์ฌ๊ธฐ์ ์ฃผ์ ๊น๊ฒ ๋ด์ผ ํ๋ ์ ์ B ํธ๋ผ์ด๊ฐ ๊ฑฐ๊พธ๋ก ๋ค์ด๊ฐ๋ค๋ ์ ์ด๋ค)
๊ทธ๋ฌ๋ฉด A์์
a
๋ฅผ ๊ณจ๋์ ๋ B์์๋bcd
๋ฅผ ๊ณ ๋ฅผ ๊ฒฝ์ฐabcd
๋ฅผ ์์ฑํ ์ ์๋ค.->$2 X 1 = 2$
A์์
ab
๋ฅผ ๊ณจ๋์ ๋ B์์cd
๋ฅผ ๊ณ ๋ฅด๋ฉดabcd
๋ฅผ ์์ฑํ ์ ์๋ค.->$1 X 2 = 2$
->$2 + 2 = 4$
์ฌ๊ธฐ์ ์ถ๊ฐ์ ์ผ๋ก ์ ์ฟผ๋ฆฌ๋ฅผ ์งํํ๋ฉด ์๋์ ๊ฐ์ ๊ทธ๋ฆผ์ด ๋๊ณ ,
์ด ์ํ์์๋ A์์
ab
๋ฅผ ๊ณจ๋์ ๋ B์์cd
๋ฅผ ๊ณจ๋ผ์abcd
๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ๋ฐ์ ์์์ ๋ณผ ์ ์๋ค.->$1 X 1 = 1$
๋...!
๐ ์๋กญ๊ฒ ์๊ฒ๋ ๋ด์ฉ